package com.imooc.log.`type`

import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.sources.{BaseRelation, RelationProvider, SchemaRelationProvider}
import org.apache.spark.sql.types.StructType

/**
 * 对于spark外部数据源来说，要先了解这几个类
 *
 * BaseRelation:1. 定义数据的schema信息，把我们的数据转成RDD[Row]。
 *              2. 展示从DataFrame中产生的底层数据源的关系或者表。
 *              3. 定义如何产生schema信息。或者说是数据源的关系。
 *
 * RelationProvider:是一个relation的提供者，创建BaseRelation。
 *                  获取参数列表，返回一个BaseRelation对象。
 *
 * TableScan：读取数据并构建行，拿出所有的数据
 *            对数据的schame信息，进行完整扫描，返回一个没有过滤的RDD。
 */
class DefaultSource
  extends RelationProvider
    with SchemaRelationProvider {
  override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = {
    createRelation(sqlContext,parameters,null)
  }

  override def createRelation(sqlContext: SQLContext, parameters: Map[String, String], schema: StructType): BaseRelation = {
    val path=parameters.get("path")
    path match {
      case Some(p) => new ImoocLogSourceRelation(sqlContext,p,schema)
      case _ => throw new IllegalArgumentException("Path is required for custom-datasource format!!")
    }
  }
}